home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Atari Mega Archive 2
/
Atari Mega Archive CD - Volume 2.iso
/
8bit
/
cislib_a
/
life5.act
< prev
next >
Wrap
Text File
|
1995-04-22
|
7KB
|
303 lines
BYTE XMAIN,YMAIN,LIVECOL=708,
DEATHCOL=709,BIRTHCOL=710,
CONSOL=53279
CARD ARRAY LINEPT(40)
PROC GR5INIT()
;INITIALIZE A GR. 5 SCREEN. WE MUST
;DO THIS TO UTILIZE THE SPECIAL PLOT
;ROUTINES WHICH I STOLE FROM AN
;OLD ANALOG MAGAZINE.
CARD SCRN=88
BYTE LINE
GRAPHICS(5)
FOR LINE=0 TO 39 DO
LINEPT(LINE)=SCRN+20*LINE
OD
LIVECOL=8
RETURN
PROC PLOT5(BYTE X,Y,COL)
;HERE IS THE STOLEN PLOT ROUTINE. IT
;IS MUCH FASTER THAN THE OS ROUTINES,
;BUT IT DOES NO CHECKING FOR ILLEGAL
;VALUES. IT IS EASILY ADAPTABLE FOR
;GR. 7 USE.
BYTE POINTER PIXEL
BYTE ARRAY COLFIL=[0 85 170 255],
MASK=[63 207 243 252],
MASK2=[192 48 12 3]
PIXEL=LINEPT(Y)+(X RSH 2)
PIXEL^=PIXEL^&MASK(X&3)
% (COLFIL(COL) &
MASK2(X & 3))
RETURN
BYTE FUNC LOCATE5(BYTE X,Y)
;HERE'S ANOTHER STOLEN ROUTINE. AGAIN
;IT IS MUCH FASTER THAN OS ROUTINES,
;BUT DOES NO TESTS FOR ILLEGAL VALUES.
BYTE POINTER PIXEL
BYTE ARRAY MASK=[192 48 12 3]
PIXEL=LINEPT(Y)+(X RSH 2)
RETURN ((PIXEL^ & MASK(X & 3)) RSH
(((X & 3) XOR 3) LSH 1))
PROC PAUZ(CARD X)
;A SIMPLE ROUTINE TO DO NOTHING FOR A
;GIVEN PERIOD OF TIME.
CARD LOOP
FOR LOOP=1 TO X DO
OD
RETURN
PROC PUTDOTS()
;THIS ROUTINE READS THE JOYSTICK AND
;MOVES A BLINKING CURSOR AROUND THE
;SCREEN. A CELL IS ACTIVATED IF
;ONE ISN'T THERE, AND DEACTIVATED IF
;IT IS THERE.
BYTE XPOS=[39],YPOS=[18],STIK=632,
STRIG=644,HOLD,NEXTX,NEXTY,
XLP,YLP
BYTE ARRAY DELTAX = [0 0 0 0 0 1 1
1 0 255 255
255 0 0 0 0],
DELTAY = [0 0 0 0 0 1
255 0 0 1 255
0 0 1 255 0]
DEATHCOL=14
HOLD=LOCATE5(XPOS,YPOS)
PRINTE("JOYSTICK BUTTON TO PLACE OR ERASE")
PRINTE("PUSH OPTION & SELECT TO CLEAR SCREEN")
PRINTE("PUSH START TO START")
DO
PLOT5(XPOS,YPOS,2)
PAUZ(2000)
IF STRIG=0 AND HOLD=1
THEN HOLD=0
SOUND(0,121,10,8)
PAUZ(4000)
SNDRST()
ELSEIF STRIG=0 AND HOLD=0
THEN HOLD=1
SOUND(0,29,10,8)
PAUZ(2000)
SNDRST()
FI
NEXTX=XPOS+DELTAX(STIK)
NEXTY=YPOS+DELTAY(STIK)
IF NEXTX<>XPOS OR NEXTY<>YPOS
THEN PLOT5(XPOS,YPOS,HOLD)
XPOS=NEXTX
IF XPOS>75
THEN XPOS=4
ELSEIF XPOS<4
THEN XPOS=75
FI
YPOS=NEXTY
IF YPOS>38
THEN YPOS=1
ELSEIF YPOS<1
THEN YPOS=38
FI
SOUND(0,60,10,8)
PAUZ(2000)
SNDRST()
HOLD=LOCATE(XPOS,YPOS)
FI
PAUZ(2000)
IF CONSOL=1
THEN HOLD=0
FOR YLP=1 TO 38 DO
FOR XLP=1 TO 18 DO
POKE(LINEPT(YLP)+XLP,0)
OD
OD
FI
UNTIL CONSOL=6
OD
PLOT5(XPOS,YPOS,HOLD)
RETURN
PROC PIXELCHEK(BYTE XB,Y)
;THIS ROUTINE CHECKS ALL THE PIXELS
;IN THE BYTE OF SCREEN MEMORY PASSED
;TO IT FOR BIRTH OR DEATH. IF A
;PIXEL IS EMPTY AND HAS THREE LIVE
;NEIGHBORS A BIRTH WILL OCCUR IN THE
;NEXT GENERATION. IF A PIXEL IS LIVE
;AND HAS MORE THAN THREE LIVE
;NEIGHBORS IT WILL DIE IN THE NEXT
;GENERATION.
BYTE LPX,LPY,LP,X,COUNT=[0],HOLD
;CONVERT X BYTE VALUE TO A PIXEL AND
;CHECK ITS EIGHT NEIGHBORS.
;MULTIPLY BY FOUR FOR PIXEL VALUE.
X=XB LSH 2
;CHECK FIRST PIXEL AND THE THREE
;WHICH FOLLOW IT.
FOR LP=X TO X+3 DO
;CHECK THE EIGHT SURROUNDING PIXELS.
FOR LPY=Y-1 TO Y+1 DO
FOR LPX=LP-1 TO LP+1 DO
HOLD=LOCATE5(LPX,LPY)
IF HOLD=1 OR HOLD=2
THEN COUNT==+1
FI
OD
OD
;THESE ARE THE POSSIBLE CASES OF
;BIRTH AND DEATH. WE ADD ONE IF HOLD
;IS ONE BECAUSE WE COUNTED IT IN THE
;SEARCH OF THE SURROUNDING PIXELS.
;
;IF A DEATH IS TO OCCUR WE RESET THE
;PIXEL COLOR TO COLOR 2. IT IS
;VISIBLE, BUT MARKED FOR DEATH IN THE
;NEXT GENERATION.
;
;IF A BIRTH IS TO OCCUR WE RESET THE
;PIXEL COLOR TO THREE. IT IS
;INVISIBLE, BUT MARKED FOR BIRTH IN
;THE NEXT GENERATION.
HOLD=LOCATE5(LP,Y)
IF HOLD=1
AND (COUNT<3 OR COUNT>4)
THEN PLOT5(LP,Y,2)
ELSEIF HOLD=0
AND COUNT=3
THEN PLOT5(LP,Y,3)
FI
COUNT=0
OD
RETURN
PROC CHEKBYTE()
;THIS ROUTINE DOES A CHECK ON EACH
;SCREEN BYTE AND ITS FOUR ORTHOGONAL
;NEIGHBORS. IF ANY OF THESE ARE
;GREATER THAN ZERO IT CALLS PIXELCHEK
;TO CHECK THE INDIVIDUAL PIXELS OF
;THE BYTE. THIS SAVES TIME FOR EACH
;PASS, SINCE BYTE OPERATIONS ARE SO
;MUCH FASTER THAN PIXEL OPERATIONS.
;THERE COULD BE ROOM FOR IMPROVEMENT
;IN THIS ROUTINE.
BYTE XLP,YLP
BYTE POINTER XBYTE,XPLUS,XMINUS,
YPLUS,YMINUS
;YLP=NUMBER OF ROWS IN A GR.5 SCREEN.
;XLP=NUMBER OF BYTES IN EACH ROW
; (FOUR PIXELS TO THE BYTE).
;XBYTE=POINTER TO BYTE BEING CHECKED
;XPLUS=BYTE BEING CHECKED + 1
;XMINUS=BYTE BEING CHECKED - 1
;YPLUS=BYTE BELOW CURRENT BYTE
;YMINUS=BYTE ABOVE CURRENT BYTE
; I'M SO CONFUSED !!!
FOR YLP=1 TO 38 DO
FOR XLP=1 TO 18 DO
XBYTE=LINEPT(YLP)+XLP
XPLUS=XBYTE+1
XMINUS=XBYTE-1
YPLUS=XBYTE+20
YMINUS=XBYTE-20
IF YPLUS^>0
THEN PIXELCHEK(XLP,YLP)
ELSEIF (XPLUS^&$C0)>0
THEN PIXELCHEK(XLP,YLP)
ELSEIF XBYTE^ >0
THEN PIXELCHEK(XLP,YLP)
ELSEIF (XMINUS^&$03)>0
THEN PIXELCHEK(XLP,YLP)
ELSEIF YMINUS^ >0
THEN PIXELCHEK(XLP,YLP)
FI
OD
OD
RETURN
PROC RESETSCRN()
;THIS ROUTINE MASKS ALL THE BYTES OF
;SCREEN MEMORY WITH A HEX $55. THIS
;SETS ALL THE DEATH PIXELS TO 00 AND
;ALL THE BIRTH PIXELS TO 01, WHILE
;LEAVING THE STATIC CELLS UNHARMED.
BYTE X,Y,MASK=[$55],HOLD
BYTE POINTER BPOINT
FOR Y=1 TO 38 DO
BPOINT=LINEPT(Y)
FOR X=1 TO 18 DO
BPOINT^==&MASK
BPOINT==+1
OD
OD
RETURN
PROC PRINTINST()
PRINTE("PRESS SELECT TO DRAW")
PRINTE("PRESS OPTION TO QUIT")
PRINTE(" ")
RETURN
PROC MAIN()
;THIS IS THE MAIN ROUTINE. IT
;INITIALIZES THE SCREEN AND STARTS
;CYCLING THROUGH THE GENERATIONS.
;AFTER CHEKBYTE IS EXECUTED IT
;CHANGES COLOR REGISTER VALUES TO
;MAKE THE BIRTHS APPEAR AND THE
;DEATHS DISAPPEAR. IT THEN CALLS
;RESETSCRN TO CLEAR OUT BIRTHS AND
;DEATHS. ALL THE WHILE IT LOOKS FOR
;THE FUNCTION KEYS TO BE PRESSED TO
;INVOKE THE CELL EDITOR OR TO END
;THE PROGRAM.
;
; ROBERT ROSENBACH
; DECEMBER, 1986
GR5INIT()
PRINTINST()
DO
IF CONSOL=5
THEN PUTDOTS()
PRINTINST()
FI
DEATHCOL=8
BIRTHCOL=0
CHEKBYTE()
DEATHCOL=0
BIRTHCOL=8
SOUND(0,20,10,10)
PAUZ(3000)
SNDRST()
RESETSCRN()
IF CONSOL=3
THEN EXIT
FI
POKE(77,0)
OD
RETURN